package demo9;

import java.util.Arrays;

public class Code03_CountSort {

	// only for 0~200 value
	public static void countSort1(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		int max = Integer.MIN_VALUE;
		//选出数组中的最大值
		for (int i = 0; i < arr.length; i++) {
			max = Math.max(max, arr[i]);
		}
		//将每个数字进行计数放到对应下标
		int[] bucket = new int[max + 1];
		for (int i = 0; i < arr.length; i++) {
			bucket[arr[i]]++;
		}

		int i = 0;
		for (int j = 0; j < bucket.length; j++) {
			//对于每一个数字都拷贝回原来的数组中
			while (bucket[j]-- > 0) {
				arr[i++] = j;
			}
		}
	}

	public static void countSort(int[] arr) {
		if(arr==null||arr.length<2){
			return;
		}

		//找出数组中的最大值
		int max = arr[0];
		int min = arr[0];
		for(int i =0;i<arr.length;++i){
			max = Math.max(max,arr[i]);
			min = Math.min(min,arr[i]);
		}
		//利用数组记录每个元素在对应下标出现的个数
		int[] hash = new int[max - min +1];
		for(int i =0;i<arr.length;++i){
			hash[arr[i]-min]++;
		}
		int i=0;
		for(int j =0;j<hash.length;++j){
			while(hash[j]-- >0){
				arr[i++] = j+min;
			}
		}

	}
	// for test
	public static void comparator(int[] arr) {
		Arrays.sort(arr);
	}

	// for test
	public static int[] generateRandomArray(int maxSize, int maxValue) {
		int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) ((maxValue + 1) * Math.random());
		}
		return arr;
	}

	// for test
	public static int[] copyArray(int[] arr) {
		if (arr == null) {
			return null;
		}
		int[] res = new int[arr.length];
		for (int i = 0; i < arr.length; i++) {
			res[i] = arr[i];
		}
		return res;
	}

	// for test
	public static boolean isEqual(int[] arr1, int[] arr2) {
		if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
			return false;
		}
		if (arr1 == null && arr2 == null) {
			return true;
		}
		if (arr1.length != arr2.length) {
			return false;
		}
		for (int i = 0; i < arr1.length; i++) {
			if (arr1[i] != arr2[i]) {
				return false;
			}
		}
		return true;
	}

	// for test
	public static void printArray(int[] arr) {
		if (arr == null) {
			return;
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

	// for test
	public static void main(String[] args) {
		int testTime = 500000;//测试次数
		int maxSize = 100;//测试数据量最大大小
		int maxValue = 150;//测试数据的最大值
		boolean succeed = true;
		for (int i = 0; i < testTime; i++) {
			int[] arr1 = generateRandomArray(maxSize, maxValue);//生成一个随机数组
			int[] arr2 = copyArray(arr1);//将arr1拷贝到arr1
			//两个数组 arr1 arr2 对齐进行排序
			countSort(arr1);//我们写的方法
			comparator(arr2);//必须正确的方法
			if (!isEqual(arr1, arr2)) {//判断是否相等对于数组的每一个元素
				//如果发现不相等立马跳出同时打印错误结果
				succeed = false;
				printArray(arr1);
				printArray(arr2);
				break;
			}
		}
		System.out.println(succeed ? "Nice!" : "Fucking fucked!");

		int[] arr = generateRandomArray(maxSize, maxValue);
		printArray(arr);
		countSort(arr);
		printArray(arr);

	}

}